Trainer - Memory etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Trainer - Memory etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

DLL-Inject (PART I)

Yazımı okuyunuz;  06 HAZIRAN 2008 CUMA
bİR KAÇ GÜN İÇİNDEMİ DEMİŞİM ? :d

Neyse işin aslı blog başıboş kalmasın dedim, birşeyler yaziyim. Madem tamamını getiremedik, parça parça part part bölük pörçük :D ekleyelim, vakti gelince part 2 3 vs de gelir inş. (Boş zamanlarımı özledim! :D)

Konumuz dll-inject. Basitçe dll-inject: o an çalışan bir process(exe) nin hafızasına bir yere kendi dllmizi kaynatmak, çaktırmadan araya sokuşturmak gibi bişey. Bu sokuşturduğumu dll de tabiki o process ile etkileşime geçmek için hazır vaziyete geliyor. Peki nedir bunun avantajı ? cidden bilmiyorum :P şaka :P bunu yapmamızın amacı şudur: ko yu örnek alarak anlatiyim basit olsn.

Xtrap diye bir icat var, ve biz ko da hile çalıştırmak istiyoruz. Xtrap ko açıkken o sıra bütün programları kontrol edecektir. Eğer sistemimizde açık olan bir program konun memorysine dokunmaya yeltenirse, 3rd party tools hack detectedı ekrana yapıştırır ve oyunu kapatır :D Burdaki mantık şudur, xTrap konun hafızasına dışarıdan gelebilecek tüm erişimleri durdurur. Ancakkkk.... Memory e erişen zaten ko nun kendisiyse bir problem olmayacaktır :) yani inject ettiğimiz dll. Anlatmak istediğim, dll yi konun memorysine soktuğumuzdan xTrap o dll yi ko ya ait sanacaktır. (yani en azından bi denemek lazım :P) eğer hile engelleme programı çok kabiliyetliyse belkide o dll nin ko ya ait olmadığını anlar ancak bunuda aşmanın yolları vardır en basitinden ko nun açtığı dll lerden biri gibi gösterilebilir. (mantıken yararlı olmayacaktır çünkü hile engelleme programı saf değilse crc-check veya header-read yapıp yine anlar) Yani bunlar bizi şuraya yönlendiriyor: burada önemli konu aslında dll yi inject etmek değildir. DLL yi inject edebilmektir. Şurdan bir örnek veriyim. Eski kohack i hatırlarsanız, o zamanlar koda HackShield koruması vardı. Ve biz karakter select ekranında koHacki açıyorduk oyuna öyle girersek çalışıyordu. Bu ne demektir ? karakter select ekranında bir açıktan faydalanılmış. Yani dll bir şekilde sokuşturulmuş demektir. (Bu açık her şekilde olabilir mantık zorlamayla beraber ollydbg yol gösterici olacaktır.) O sırada hackshield hile kontrolü yapmıyordur, veya o sırada dll inject edildiğinde ko yu kapatamıyor, hata veremiyordur veya fill with nop vs vs... 

Inject ettiğimiz dll dialogsuz olabilir, hotkeylerle çalışabilir ancak dialoglu olması (HF) tarzında daha mantıklıdır. Inject edilmiş DLL nin bir avantajı daha vardır, daha hızlı çalışacak, adreslere daha hızlı erişecektir, yani dışarıdan çalışan bir exe ye göre. (şuan kullanılan hile programları)

Neyse, bu part için bu kadar yeterli sanırım, aşşağıda verdiğim kodlar DLL-Inject UDF sidir. Önümüzdeki partda inject ettiğimiz dll yi çağırmayı ve komut yollatmayı anlatıcam. Bunu bir isimde kaydedip include vererek kullanabilirsiniz.

Şunu söyleyebilirimki bu konu şuan gözümde baya uzun görünüyor. bikaç aşama sonra ollydbg makalesi vs hazırlamam gerekicek gibi. Neyse önümüzdeki günlerde görüşürüz. Çalışmalarınızda başarılar.

Tek isteğim şudurki bu script yanlış ellere geçmesin, lütfen heryerde paylaşmayın...
Func _InjectDll($hWnd, $dllpath)
   ;girdilerin doğru olup olmadığı kontrolü, hwnd varmı yoqmu vs...
   If $hWnd <= 0 Then
      SetError(-1)
      Return False
   ElseIf StringLen($dllpath) <= 4 Or StringRight($dllpath, 4) <> ".dll" Then
      SetError(-2)
      Return False
   EndIf

   Local $pid, $pHandle, $pLibRemote, $modHandle, $LoadLibraryA, $hThread

   ;inject için gereken dll.
   Local $kernel32 = DllOpen("kernel32.dll")

   ;hwndmizin process id sini bulma.
   $pid = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hWnd, "int_ptr", 0)
   If IsArray($pid) Then
      $pid = $pid[2]
   Else
      SetError(-3)
      Return False
   EndIf

   ;hwndnin memorysine erişim.
   $pHandle = DllCall($kernel32, "int", "OpenProcess", "int", 0x1F0FFF, "int", 0, "int", $pid)
   If IsArray($pHandle) And $pHandle[0] > 0 Then
      $pHandle = $pHandle[0]
   Else
      SetError(-4)
      Return False
   EndIf

   $pLibRemote = DllCall($kernel32, "int", "VirtualAllocEx", "int", $pHandle, "short", 0, "int", 0x1000, "int", 0x1000, "int", 4)
   If IsArray($pLibRemote) Then
      If $pLibRemote[0] > 0 Then
         ;konsol kontrolü, debug.
         ConsoleWrite("0x" & Hex($pLibRemote[0], 8) & @CR)
         $pLibRemote = $pLibRemote[0]
      Else
         SetError(-5)
         Return False
      EndIf
   Else
      SetError(-6)
      Return False
   EndIf

   For $i = 0 To StringLen($dllpath)
      $ret = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $pHandle, "int", $pLibRemote + $i, "int_ptr", Asc(StringMid($dllpath, $i + 1, 1)), "int", 1, "int", 0)
      If IsArray($ret) Then
         If $ret[0] = 0 Then
            SetError(-7)
            Return False
         EndIf
      Else
         SetError(-8)
         Return False
      EndIf
   Next

   $modHandle = DllCall($kernel32, "long", "GetModuleHandle", "str", "kernel32.dll")
   If IsArray($modHandle) Then
      If $modHandle[0] > 0 Then
         $modHandle = $modHandle[0]
      Else
         SetError(-9)
         Return False
      EndIf
   Else
      SetError(-10)
      Return False
   EndIf

   $LoadLibraryA = DllCall($kernel32, "long", "GetProcAddress", "long", $modHandle, "str", "LoadLibraryA")
   If IsArray($LoadLibraryA) Then
      If $LoadLibraryA[0] > 0 Then
         $LoadLibraryA = $LoadLibraryA[0]
      Else
         SetError(-11)
         Return False
      EndIf
   Else
      SetError (-12)
      Return False
   EndIf

   $hThread = DllCall($kernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $LoadLibraryA, "long", $pLibRemote, "int", 0, "int", 0)
   If IsArray($hThread) Then
      ConsoleWrite($hThread[0] & @CR)
      If $hThread[0] > 0 Then
         $hThread = $hThread[0]
      Else
         SetError(-13)
         Return False
      EndIf
   Else
      SetError(-14)
      Return False
   EndIf

   DllCall($kernel32, "int", "VirtualFreeEx", "int", $pHandle, "int", $pLibRemote, "int", 0x1000, "int", 0x8000)
   DllCall($kernel32, "int", "CloseHandle", "int", $hThread)
   DllCall($kernel32, "int", "CloseHandle", "int", $pHandle)

   DllClose($kernel32)

   Return True
EndFunc

KeyBuffer ve Kullanımı

Merhaba ziyaretçiler, blog takipçisi arkadaşlar ve bu yazıyı okuyanlar :P
Google amcanın yönlendirmesiyle demiri attığınız bu yegane blog sayfasında uzun süredir yazmayı planladığım makaleyi yazmak 2 adet korku filmi izledikten sonra kaçan uykum sonrasında pazartesi sabaha karşı 4:30 sularına nasipmiş :D neyse uzatmayalım başlayalım.

Oyunlar bildiğimiz üzere klavyede yer alan tuşlarla oynanıyor :P otomasyon içinde bu tuşları kullanmanın en basit yöntem olduğunu biliyoruz. Bir oyunda tuşa basmak için birkaç yöntemimiz var. (veya tuşa bastığımızı bildirmek.)

1-> Elimizi kullanarak klavyeyle temasa geçmek. :P
2-> Sendkey (Directinput ile tuş simülasyonu yapmak / user32.dll saolsun.)
3-> PostMessage (Belirlenen pencere başlığına veya penceredeki herhangi bir kontrole string yollamak. ki bu string diyelimki 1 ise oyun bunu 1 e basıldı şeklindede algılayabiliyor.)
4-> Keyboard Buffer dan yararlanmak (Memory).

Konumuz bilindiği üzere 4. maddedir.

Memory herşeyin işlendiği yer olduğundan tuşa bastığımızda yine doğal olarak orada işlenecektir. Keyboard buffer tuşların basılmayı bekledikleri memorydeki adresleridir.
kullanıcı tuşa bastığında değer işlenir. Windows üzerinde çalışan her programın + windowsun hatta bios un bile bir keyboard bufferi vardır. Mantığını daha basit anlatmak gerekirse, ram de hertuşun bir adresi vardır diyelimki bu 1 den 10 a kadar olsun bu 1 ile 10 arasının tamamıda keyboard buffer oluyor efenim. Bu adresciklerin herbiri farklı bir tuş içindir mesela 1 a nın 2 b nin 3 e nin gibi. ve hepsinin değeri o anlık 0 dır taki siz o tuşa basana kadar. bastığınızda 1 olur.
Keylogger programları bu mantıkla çalışır. Çoğu windowsun keyboard bufferine yapışır ve malum değer 1 olduğunda tuşa bastığınızı tespit eder. Notepad ın bile bir keyboard bufferi vardır, yani notepad e bile MSN Koxp kurabilirsiniz bilmem anlatabildimmi :D

Oyunlardakininde pek bir farkı yok. Konuyu fazla uzatmayada hiç gerek yok. aslında çok basit. memory ile haşir neşir olduğunuzdan aslında çoktan bulmanız gerekirdi ama, zamanında benimde aklıma gelmemişti tuş gönderme yöntemlerini ararken rastladım ve araştırdım.

Yapmanız gereken şudur. KO ya girin. cheat engine herzamanki gibi bizimle olucak.
Namı değer MSN koxp :D açın msn i alın ontop mode üstte dursun z yi basılı bırakın. değişeni aratın. sora z yi serbest bırakın bir daha değişeni arayın. 1 veya birkaç değere indirene kadar devam. Doğru adresi bulduğunuzu anlamanın yöntemiyse şudur: Elinizde 1 kaç adres kaldı diyelim, z yi tekrar basılı bırakın msn yardımıyla ve cheat engineden 1 olan değerleri tek tek 0 yapın ve pencereyi aktif yapmadan, cheat engineyi hafif kaydırarak yukardan oyuna bakın bakalım z yi bırakmışmı. eğer z yi bırakırsa doğru adresdesiniz demektir. (oyuna dönmemeye dikkat edin yani sizin anlayacağınız dilden msn koxp u bozmadan bakın karakter z yi bırakmışmı diye.)

Adresi buldunuz, aynı şekilde pointerini ve offsetinide buldunuz olay tamam sayılır. diğer tuşları offsetde hafif oynamalar yaparak bulabilirsiniz tek tek uğraşmadan. +4 +4 atlayarak diğer tuşlara ulaşın. basit bi script yapın, sürekli o tuşu göndersin ama pencere bu kez aktif olsun rahatça bulun. Eğer diyorsanız ki tuşu göndermeyi söylemedinki nasıl göndericez :D söyliim.

Başından beri anlattığım üzere bu adres 0 dır ve siz tuşa bastığınızda 1 olur o halde mantığımızın yönlendirdiği üzere memory ile bu adrese önce 1 ve biraz bekleyerek 0 yazdırıcaz. bu biraz beklemeyi kafanızdan hesaplayabilirsiniz, yani sizin bir tuşa basmanız saniyenin kaçta kaçı zamanda olur ? ben saniyenin 10/2 si gibi bi zamanda basıyorum, kabiliyet :D, 200 sleep :P

Son olarak benim denemelerimden bahsediyim, benim son olarak geldiğim nokta:
Tuşları oyuna gönderiyorum, ve oyun aktifken çok güzel çalışıyor. en güzel özelliği aslında chat penceresiyle karışmıyor, yani rahatça yazabiliorsunuz. Sorun şuki, oyun aktif değilken skilleri göndermeyi bir türlü başaramadım, WOLF dışında :D nedendir bilmem wolfu pencere aktif değilkende atıyordu. Şu olabilir sizi yanıltmasın, script pencereniz her zaman üstte olsun, atak yaparken kendi pencerenize tıklayın, çok çok basitçe hiç uğraşmadan msn koxp yaparsınız.
ama diğer tuşlarınız basmaz. sadece z1. şansınız olursa benim gibi belki wolfuda atarsınız :D

Herşeye rağmen benim görüşümce bu yöntem sendkeyden çok daha iyi işliyor. en azından arka planda z1 atıyor bence bu bile yeterlidir :) ufak bi not daha ekliyim, bazı tuşlar çok geç bastığından ben 1 ve 0 yazdırmak yerine sürekli 1 yazdırıyordum. o zaman daha seri basıor ve arka plana geçmek istediğimde çok daha rahat geçiyordu. önerim sizde öyle yapın, sadece zamanlı skilleri 1-0 şeklinde yapın. Vaktim olsaydı keşke biraz daha zorlardım ama belki sizlerden birisi çok daha iyi çalıştırabilir ve bizimlede paylaşır. Ben en son skill vururken pencere aktifmi değilmi falan kontrolümü yapıyor acaba diye biraz kurcaladım cheat engine den. pencere aktif-değil şeklinde aratarak, birkaç sonuç buldum directx8 ile alakalı çıkıyor ama hepsi ve değeri değiştirince oyun donuyor, mantığını çözemedim :)

Neyse, takıldığınız bir yer olursa cevaplamaya çalışırım, kullanması ve geliştirmesi size kalmış anlaşılmıyacak biryer yoktur umarım, bir sonraki makalede görüşmek üzere :P
Bol şanslar.

Memory Olayları

Selamlar arkadaşlar, uzun bi aradan sonra memory konusuna nihayet girmeyi başarıcaz :P
Malum iş güç, okul vs derken hayat akıp gidior insanın vakti kalmıyor, neyse konumuz uzun hemen geçelim..

Memory derken kastettiğim şey bildiğiniz ram değil, bir oyunun ram de kapladığı yer, yani işlenen geçici verilerinin saklandığı adres aralığıdır. Eee bu geçici verilerden hangileri işimize yarar ? örneğin hp, lvl puanı, mana, para vs.. gibi değişken değerler bize gerekenlerdir :)

Neler yapabiliriz bu değerlerle, örneğin hp mizi dondurabiliriz, aynı şekilde mana mızı, oyuncumuzdaki parayı değiştirebiliriz, veya bot yaparız karakterimizi bu değerlerle kontrol ederiz. Nasıl kontrol ederiz hemen onuda açıkliyim, diyelimki bıraktık biryere karakter kasıyor :) ama dmg de alıyoruz arada dolayısıyla canımız iniyor, 0 oluncada malum, ölüyoruz :) botumuza değeri gireriz, hp şu değere indiğinde bas can potunu ölmiyelim deriz oda basar :)

Hp dondurmaktan bahsettik, bu nedemek ? hp mizi 1000e dondururuz misal, yaratık vursada canımız inmez, cunku o değere surekli 1000 yazılmaktadır. 900e insede tekrar 1000 olacaktır. Ancakkk..... burda dikkat etmemiz gereken şey Client-Side , Server-Side olayıdır. Nedir bu olay hemen açıklayalım. Biz oyunu oynadığımız için Client side de bulunuruz. Misal olarak biz karakterimizin canı normalde 1000 se bunu 10.000, 100.000 yaparız ama sorun şudur ki Server karakterimizin gerçek canını biliyorsa 1.000.000 da yapsak 1000 dmg alınca ölürüz :) Ki çoğu online oyunda bu böyledir, bazı temel değerler server tarafındanda bilinir. Serverin databasesinde karakterimizin tüm temel özellikleri kayıtlıdır. Eğerki kayıtlı değilse, zaten o oyun oynanmayacak bir hal alır ve dandirikde bir oyundur zaten :) Metin 2 de sanırım bu olay vardı ortalıkda canı inmeyen adamlar dolasıyordu :))) Neyse kısaca server side client-side yi en basit şekilde anlatmaya çalıştım anlaşılmıştır umarım. Serverin bilmediği şeyler üzerinde değişiklik yapabiliriz bu anlaşılmıştır, bildiği şeyler üzerinde ise değişiklik yapamayız ama bu konuda bi artımız vardır, onları bizde bilebiliriz. :)

Memory karışık olduğu kadar aslında basittirde. Eminimki bu yazıyı okuyanların yuzde 80 i Cheat-Engine kullanmıştır. Cheat-Engine saygıdeğer bir yazılımdır onsuz işimiz çok zor olurdu :)

Memory i bugüne kadar kullanan veya kullanmaya çalışanların eminimki coğunluğu "Yaa bu benim pc de çalışıyor, arkadaşda çalışmıyor veya Oyunu kapayıp açınca bir daha çalışmıyor" gibi yakarışlar içindedir :D Bu hataya coğu kişi düşer aslında bu bi hata bile değil sadece bi başlangıçtır, siz birşeyler yaptığınızı sanırsınız ama olaya daha yeni başlamışsınızdır.

Memory de tutulan değerlerin adresleri, oyun her açıldığında değişir. HP, MP, Vs.. i daha once kullananlar, her değer için farklı adres olduğunu sanarlar ama bu bir bakıma yanlıştır. Knight Online yi örnek alarak anlatmaya devam edelim.

Her patch de exenin boyutları değişir bildiğiniz gibi 1kb da olsa 1mb da olsa 1byte da olsa değerlerin adresleri değişecektir. Bir önceki bahsettiğim değişmeyle bu değişme bir değildir. Patch geldiğinde adresler gerçekten değişir :) yani patch başına programdaki adresleri tekrar güncellemeniz gerekir. He diyceksinizki ben oyuna her girişimde adresmi güncelliyicem.. evet...
şaka :D hayır. Dediğim gibi o ve bu farklı şeylerdir. İşin aslı ne biliyormusunuz... Pointer diye dümbelek bişey var o :)))

Pointer Nedir : Dediğim gibi oyun her yüklenişinde adresler değişir.. Ancakkkk.... Değişmeyen bir şey vardır... :) oda değişen adresin adresini barındıran pointer dır ve bu temel adresden istediğimiz değere (hp,mp,vs..) gitmemizi sağlayacak Offset dir. Pointer işaret demek ingilizce galiba. Yani bize o değişen adresi işaret eder. Derki bak bu dallama yine yer değiştirdi buldum şuraya gitmiş. Bizde temel adresi alırız, ve zaten bildiğimiz ve elimizde olan Offsetide onla toplayıp istediğimiz değere ulaşırız. Pointer ve offset hiç bir zaman değişmez. Takiii bir sonraki patch gelene kadar.

Hemen şunuda söyliyim. Dedim ya hani hp mp vs değerleri daha oncede bulup kullanmış olanlar, her birinin ayrı bir adres olduğunu düşünürler. Bu yanlıştır. Temel bir adres vardır. Yani hemen şöyle açıklıyıyım. Array ın ne olduğunu bilenler için arraya benzer bişeydir bu :P Diyelimki temel adresimiz "0xABCDEF" olsun. HP değerini bir offset yardımıyla buluruz. Yani şu şekilde olacaktır. "0xABCDEF" + "0x510" burdaki "0x510" hp nin offsetidir. Aynı şekilde diyelimki "0xDE5" de mananın offseti olsun, "0xABCDEF" + "0xDE5" olarak onuda bulacagızdır :) (bulacagızdır :D..) Offset ne ya nasıl bulucaz demeyin onuda anlatıcam meraklanmayın :D

Oncelikle Cheat-Engine de adres ve offset bulmakdan bahsedelim biraz. Bu konuda Cheat-Engine nin forum sitesindeki tutorial ve yardım konularını okumanız gerçekten sizin için çok faydalı ve kesinlikle gereklidir!. Ben çünkü resimli anlatamıycam şimdi dediğim gibi konu zaten uzun ve resim çek ekle vs.. uğraştıracağı için elimden geldiği kadar basit bi şekilde adım adım anlatmaya çalışıcam.

Cheat-Engine de pointer ve offset bulmak :
(Knight Online den örneklendiriyorum, "CE = Cheat-Engine", "KO.exe = KnightOnLine.exe")

1-> Oyunumuza giriyoruz. Karakter gelene kadar bekliyoruz..
2-> CE açıyoruz yukardan pc iconuna basıp KO.exe seçiyoruz ok luyoruz.
3-> Artık CE KO.exe nin memory adres aralığında işlem yapmaya hazır durumda.
4-> Oyundaki hp mizi CE ye giriyoruz ve first scan basıyoruz. (Decimal olarak arıyacaız yani HEX seçili olmaycak. Hex 0x123, 0xABC şeklindeki değerdir, decimalse sadece sayılardan oluşr)
5-> Sol tarafta 100 200 veya birkaç yüz değer çıkıcak.
6-> Oyuna dönüyoruz, hp mizi değiştiriyoruz. (yükseltmek veya azaltmak farketmez, değişmesi yeterli)
7-> Daha sonra hp değerini bir daha giriyoruz ve next scan a basıyoruz.
8-> Sadece bir adres kalmış olması gerekir eger kalmamış ise tesadufdur baştan yapın bir adres kalana kadar.
9-> Artık hp nin adresini bulduk. Bulduğumuz bu adres pointer değildir karıştırmayın. Temel adresde değildir. Temel adress ve offset toplamıdır. Oyunu tekrar başlattığımızda bu adres değişecektir. O yüzden pointer bulmamız gerekiyor. (üstüne basıyorumki anlaşılsın :).)
10-> CE de solda kalan tek adresi cift tıklayarak aşşağa alıyoruz.
11-> Buna sağ tıklayıp "find out what writes to this address" diyoruz. Bişey cıkıor hede hodo dior yes dioruz.
12-> Karşımıza gelen ekran oyle kalıor dokunmuyoruz.
13-> Tekrar oyuna donuyoruz hp mizi bir daha değiştiriyoruz.
14-> CE donuyoruz bakıyoruzki o ekranda bişey yazıyor. mov eax esi cart curt şeklinde.
15-> Şimdi stop a basıyoruz ve o gelen yazıya çift tıklıyoruz.
16-> Karşımıza gelen ekranda, the pointer you probably find hede hodo is : 0ABCDEF şekline bişey yazıyor. Onu bir kenara not alıyoruz. Ve burda en ortada kırmızı ile yazan satırda misal olarak : "mov, [eax+00000e4]" şeklinde bir yazı var. burada + dan sonraki kısım bizim aradığımız offset dir. bu e4 değilde 500 510 600 de olabilirdi. veya eax*4+00000e4 şeklinde daha komplex bişeyde olabilirdi. mesela bu komplexden alacağımız sonuc 4+e4 = e8 olacaktır.
Bunları anlamak için cheat engine tutoriallerini mutlaka okumanızı tavsiye ederim. Google a yazın cheat engine diye ana sayfasınadan forumlara girin tutorialleri bulursunuz :D Ayrıca + yada dikkat edin mesela o [eax-00000e4] olsaydı offsetimiz E4 yerine -E4 olacaktı yani temel adresle toplamak yerine çıkarıcaktık...
17-> Neyse, Şimdi bu the pointer you propably hede hodo dedim ya o değeri bir kenara yazıyoruz. O bizim aradığımız temel adresdir. Offset ide tabiki yazıyoruz bir kenara oda hp nin offsetidir. Şimdi o pencereyi kapayalım. CE geri donelim, New scan yapıp hex kutusunu seçelim.
O bulduğumuz temel adresi yapıştırıp first scan diyelim. Karşımıza coğu zaman sadece 1 adres gelir. ama 1 kaçda gelebilir boyle durumlarda merak etmeyin, gerçek adres coğu zaman %90 cogunlugu sayılardan olusan, sayıyla baslayan, veya en bastaki en küçük değerdir. Bu bulduğumuz adress, bizim temel adresimizi işaret eden Pointer dir.
18-> Pointeri bulduk :) artık her oyuna girdiğimizde baştan adress aramıycaz :D Pointeri doğru buldukmu diye göz atmak isterseniz hemen CE den add new adress i tıklayarak pointer kutucugunu isaretleyebilir kutuya bu yeni adressi (karıştırmayın sol tarafta olan yani onceki buldugumuz temel adres dediğimiz değil, sol tarafdaki) yazıyoruz ve offsetide yazıp ok basıyoruz. Aşşağıya yeni bir address eklenicek bu addressin value kısmında eğer hp değerimiz yazıyorsa doğru adresdeyiz demektir :) eğer ??? şeklinde bişey yazıyorsa bir yanlışlık yaptık demektir, ve baştan tekrar denememiz gerekmektedir. dikkatlice :)
19-> Elimizdeki değerlere bir göz atarsak, Temel adress e artık gerek kalmadı neden ? cevabını kendi kendinize bi verin, ondan sonra okumaya devam edin!

Çünkü pointeri bulduk.. Bu pointer oyuna her girdiğimizde değişen temel adresi bize verecektir.
Bizde offsetleri girip istediğimiz değere ulaşacağız.
20-> Sonuc olarak pointer ve hp offseti elimizde. Sadece hp yi bulduk, bundan sonrası size kalıyor. Aynı şekilde manayı vs de bulacaksınız. Ama bu sefer bize gereken sadece offseti. Pointeri nasıl olsa bulduk. Unutmayın ki birçok temel değer bir arada bulunur. yani aynı temel adresi kullanırlar. En azından ko da öyle. Ama şunuda söyliyim hemen farklı konulardaki şeyler farklı adreslerde buluna bilir. yani silahın durabiltysi ile karakter ozellikleri ayrı temel adresler kullanırlar.

Tutorial bu kadar artık autoit e dönelim :) bende nerde olduğumu ne yazıcağımı unuttum ya gerçi bi yerden girelim neyse. :)

Auto-it De Memory İşlemleri
Oncelikle bu olay için bize bir memory include si gerek bende olan NomadMemory.au3, bundan orneklerle calısıcam sizinde bunu temin etmeniz gerek devam etmek için. Autoit in forumlarında aynı şekilde yazarsanız bulabilirsiniz.

En baştan başlıyalım artık detaya girmiycem, kodun yanına açıklamasını yazıcam. Temel komutları açıklamıycam zaten biliyorsunuz..

$pid = ProcessExists("KnightOnLine.exe") ; bu memory open fonksiyonu için gerekli. yani bunun return değeriyle memory açabiliyoruz.
$mem = _MemoryOpen($pid) ; KO nun memory sine erişimi açıyoruz.

Bunları en başa global olarak ekleyebiliriz. bir kere kullanıcaz. bundan sonra bir fonksiyon yapmanızı size oneririm. fonksiyonlarla çalışmak daha kolaydır. ilk yapıcagımız fonksiyon temel adresi ogrenmektir. bunun için fonksiyonumuz şudur:

Func _BaseAddressBul($sPointer)
Return $BaseAddress = _MemoryRead($sPointer,$mem) ;elimizde zaten bulunan pointer adresini _MemoryOpen ile yeni açtığımız $mem değerinden okuyoruz. Burda hata almamak için en uste Global $BaseAddress = "" eklememiz lazım. Variableyi tanıtmayı unutmayın.. aslında bunuda yazmamam gerekti ya neyse sonradan okuyanlar için, birdaha yazmıcam ama bu tip bi açıklama :)
EndFunc

Artık $BaseAddress değerimiz oyunu her açtığımızda değişen temel adresi pointerimiz yardımıyla bize bulucak. Geri kalan şey ise Offseti buna ekleyip istediğimiz değeri bulmak. Buyrun oda bu şekilde:

Func _DegerOku($sAddress = $sBaseAddress,$sOffset,$sMem)
$sOffset = Dec($sOffset)
$finalAddress = "0x" & Hex($sAddress+$sOffset)
Return _MemoryRead($finalAddress,$sMem)
Endfunc

Bu fonksiyon direk bize istediğimiz değeri verecektir, hp mp vsss.
Açıklamasını yapalım hemen, $sOffset i dec e cevirmemizin nedeni şudur pointerden gelen adres bize decimal olarak gelir yani sayılardan oluşur. Toplayacağımız için onunda dec olması gerekir. Final adres değişkeninde başına "0x" eklememizin nedeni nomak memory nin bu şekilde okuması ornegin visual basicde &H ekleriz 0x yerine. daha sonrada toplamı hex e çeviriyoruz.
sonucta elimizde kalan değer "0xE295034" vs tarzında bişey oluyor. Fonksiyonun kullanımını söylemiycem çözmeniz zor değil bu kadar hazırcı olmayın, hatta çözülecek birşey bile yok :)

Son olarak herşeyi düzgün yaptık, hp değeri elimizde. Bunu nasıl kontrol edicez onuda basitce söliyim hemen :) Mesela onceki testmac de verdiğim ornek bununla cok guzel bi şekilde kullanılır. Tek yapmanız gereken değeri bi değişkende tutmak, loopda input box daki değeri okuyup, eğer aldığımız hp değeri input boxdakinden küçükse Send(Pot tuşu) şeklinde olacaktır.

Memoryi kullanarak yapabileceğiniz şey çokdur, hayal gücünüzü kullanın. Bu sizin Cheat Engine yi ve memory i nekadar bildiğinize bakar. Misal olarak wallhack, gm modu bunlarda client side memory ile yapılır. örnek olarak wallhack Client Side dir, yani server sizin duvara girip girmediğinizi kontrol etmez.. Client, Server side olayına iyi bir ornekdir bu. Wallhack e gm mod da dahildir. Yazınız mor gozukur. Ama sadece siz gorursunuz. Neden ? cevap verdiniz siz verdiniz :) Doğru cevap. Çünkü server gerçek GM nin siz olmadığınızı bilir.

Bu konuya yapacağınız yorumlarda lütfen şunu nasıl yapıcam bunu nasıl yapıcam diye sormayın. Eğer bir hatanız veya takıldığınız biyer varsa cevaplamakdan mutlu olurum :) Ama dediğim gibi ya chardaki parayı nasıl değiştiricem, dex i nasıl 500 yapabilirim, Aga dupe yapakmı vs bu tip sorularınız cevapsız kalacaktır :))) Çünkü bu tip şeyleri benden öğrenmeniz size hiç bir şey katmaz, kendi kendinize birşeyler üretmeniz her zaman kalıcı olacaktır ve sizi dahada ileriye taşıyacaktır, bunu tamamen yaptıktan pişirdikten sonra bakıcaksınız ki artık daha farklı daha zor şeylerle uğraşıyor olucaksınız. Orneğin ko ya direk paket gondermek gibi... Şuan bende o aşamadayım ve baya yol kat ettim. Eğer iyice pişirirsem sizede bi parça bişeyler düşer elbet :P

Sonuç olarak ben size işin temelini ve zor olan kısmını verdim, size kalansa kolay olan kısmını yapmak, bu fonksiyonları scriptinize direk olarak ekleyebilirsiniz ve kullanabilirsiniz. Sabahtan beridir bu yazıyı yazıyorum uzadıda uzadı dolayısıyla varsa bir hata kendiniz duzeltebilirsiniz. Mantığı anlamış olmanız yeter. Şimdilik sendkey ile idare edin, birdahaki konuda oyunun KeyboardBuffer ini kullanmayı anlatıcam, yani sizin anlayacağınız dilden ALT+TAB modu :)

Son olarak benim korkum şudur piyasanın AhmetKOXP mehmetKOXP dolması. Bu konuda unutmayınki herkezle eşit olursanız sizin hiçbir ayrıcalığınız kalmaz, yapın geliştirin, ama nolursa olsun yaymayın kendiniz kullanın. Kabiliyetinizi ve pc başında harcadığınız onca zamanı hiç anlamayan beleşçi aga kardeşlerimize yedirmeyin :) Geliştirip para kazanma amacında olanlarada şunu söliyebilirim. Piyasanın en iyisi bildiğiniz gibi HF dir. Ancak onun seviyesine geldiğinizde pazarlama işine atılın :) Bi ara çıkan kole gibi 2 ay sonra yalan olmayacak durumdaysanız atılın, Inanınki insanlarla uğraşmak zordur. Bu işin yasal sorumluluklarınıda unutmayın tabiki. Sonuç olarak kalite bi bot yapmak %100 ise bu işide yaptıktan sonra siz bu yolun %40 ında olacaksınız ve siz %10 daha ilerledikçe %100 %110 olacak bunu unutmayın.

Bu kadar edebiyat yeter :D ama hoş görün burda birşey paylaşıyorum ve doğru insanlara gittiğinden emin olmak isterim. Neyse, Sağlıcakla kalın, iyi scriptlemeler.

Profesyoneller için :)

Selamlar, uzun zamandır yeni post atmadım taki bu günü bekledim :P
Auto-it ile ileri duzeye gelmiş arkadaslar için bi güzellik yapıcam.
Güzel botlarınız :P HackShield tarzı programlar yuzunden çalışmıyormu ?

Projemi tamamlamaya az kaldı,
Auto-it ile dll injecti önümüzdeki hafta paylaşıyorum ve açıklamasını yapıorum
bekleyiniz... :P

Z1 Macro + Heal - Oyuna Bot Yapmak - Bir Nevi Koxp :P

Öncelikle, bot dediğimiz şey bizim yapmamız gereken işlemleri yapan programdır robot un kısaltması olsa gerek :D.

Çok çok iyi bir bot yapmak için assembly kullanmak gerekir, ama işimizi görücek derecede bir botu auto-it le rahatça yapabiliriz.

Daha öncede söylediğim gibi, neler yapıcağımızı kafamızda planlayarak, işe başlıyoruz.


-> Planımız bu;
3 tane button, 2 tane label, 2 tane input, 2 tane combo, 1 tane checkbox ekliyoruz. Buttonların birisi başlat, diğeri durdur, öbürü çıkış, labellerin birisinde HP diğerinde MP yazıyor, hemen bu labellerin yanına 2 inputu ekliyoruz, bu iki inputun yanınada 2 comboyu ekliyoruz, checkbox ise kutu toplamak için.
Kısaca ne yapmış olduk ? Oyundaki Karakterimizin, HP si kaça düştüğünde Potion kullansın amacıyla istediğimiz HP yi girebileceğimiz bir input ve hemen yanınada potionu kullanmak için hangi tuşa basıcağını belirleyebileceğimiz bir combo koyduk, aynı şekilde diğer input ve comboda MP için.
Kısaca ben başlata bastığımda bot misal "é1" basıp atack yapmaya başlıycak, HP si girdiğim değere düşünce HP tuşuna basıcak potion kullanıcak, mp si bitince aynı şekilde, checkbox u seçdiysem "space" ye basıp kutuları topliycak ve durdura bastığımdada durucak :), planı kurduk şimdi sırada yapım aşaması.

GUI mi oluşturdum, elimde şöyle birşey var ve bunu SciTE ye aktardım;


Keypress göndermek işin basit tarafıdır, bunu yapmak için gereken şey;
Başlat buttonuna başlatma görevi vermek ve while döngüsünün içine başlatıldığında şu tuşlara durdurana kadar bas komutlarını yerleştirmek. Bunu şu şekilde yapıyoruz ;
Dim $basla = 0

While 1
Sleep(100)
if $basla = 1 then
Send("z1")
endif
Wend

Func Button1Click()
$basla = 1
Endfunc

Func Button2Click()
$basla = 0
Endfunc
görüldüğü gibi olayımız bu :). Sırada kutu toplama var, onuda basit bi şekilde döngünün içine yerleştiriyoruz.
Şu şekilde ;
if GuiCtrlread($checkbox1) = $GUI_CHECKED then ;burada eğer checkbox1 seçiliyse dedik.
send("{SPACE}")
endif
bunu while döngüsünün içine z1 den sonra yerleştiriyoruz.

Şimdi sıra geldi hp ve mp yi okumaya.
Bunun 2 yolu var birincisi pixelsearch yöntemi, yani ekranda renk taraması yaparak hp nin azaldığını anlamak
ikincisi ise memoryread yöntemi, yani direk olarak memoryden Hp yi okumak, ki bu daha güvenlidir.
Ancak her pc de memory değerleri aynı olmayabilir. Yani sizde çalışan program arkadaşınızda çalışmayabilir.
Bunun için şimdilik memory i bi kenara atalım ona daha sonra yer verelim. Pixelsearch ı işleyelim. Bu nedenle hp değeri girmeyide şimdilik atlıyorum..

Duzgun bir şekilde pixelsearch ı gerçekleştirmek için ilk olarak HP bardaki rengi ve ekrandaki yerini bilmemiz lazım.

Bunu öğrenmek için hemen basit bir script yazalım.

;Script

While 1
Sleep(250)
$pos = MouseGetPos()
$pixelrengi = PixelGetColor($pos[0],$pos[1])
ToolTip("X : "&$pos[0]&" Y : "&$pos[1]&" Renk : "&$pixelrengi)
WEnd
Bunu bu şekilde exe ye çevirelim ve oyun açıkken hp barın tam ortasına getirelim,
tooltipde görünen değerler X pozisyonu, Y pozisyonu, ve o pozisyonlardaki renkdir.
Şimdi bu ne işimize yarıycak onu söyliyim, bunları bir kenara not aldıktan sonra,
diyelimki renk kodumuz : 12345678,
renk kodunun pozisyonları : X 300, Y 400,
şu kodu ekliyoruz;

Dim $PotKey = Guictrlread($combo1)

While 1
Sleep(250)
$pixelrengi = PixelGetColor(300,400)
if $pixelrengi = "12345678" then
sleep(10)
else
Send($PotKey)
Endif
WEnd
hemen açıklamasını yapalım, dim ile $potkey in comboda yazan değer olduğunu belirttik.
Yani comboda 1 yazıyorsa 1e, 2 yazıyorsa 2ye 3,4.. vs basıcaktır.
Döngüde yaptığımız olay ise, x300 ve y400 deki renk 12345678 ise bişey yapma ama değil ise hp tuşuna basdır. Biraz daha basit açıklarsak, hp bizim değerini aldığımız tam ortadan aşağı düşerse orası bildiğiniz gibi siyah olur, script orayı siyah gördüğü anda hp tuşuna basıcaktır, kırmızı olduğundada durucak tekrar siyah olmasını bekleyecektir.

Pixelsearch ın düzgün çalışabilmesi için diyelimki siz renk belirlemesi yaparken 1024x768 ekran çözünürlüğü kullandınız o halde, başka bir bilgisayarda kullanılıcak ise çözünürük doğal olarak aynı olmalıdır.

Scriptin tam halini burdan indirebilirsiniz:
http://rapidshare.com/files/83964511/testMac.au3.html

Şimdilik bu kadar, olayın temeli anlaşılmıştır heralde.
Unutulmaması gereken, eğer gameguard veya xtrap tarzı bir program açık ise scriptimizi engelleyecektir :).
Bir dahaki sefer memory ile hp mp kontrolüne değinicem, şimdilik herkeze kolay gelsin,
iyi scriptlemeler. :P